package Test;

import java.util.LinkedList;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

import junit.framework.TestCase;


import Dominio.Productos;
import Presentacion.VentanaCliente;
import Presentacion.VentanaLogin;

public class testGeneral extends TestCase{
	VentanaLogin vLogin;
	public void testLoginC() {		
		vLogin=iniciarSesion();
		assertTrue(vLogin.cliente.isVisible());			
	}
	
	public void testAnadirProductosC() throws Exception{	
		setUp();
		testLoginC();
		double costoActual;
		double costoNuevo;
		double costoCorrecto;
		double resto;
		if(vLogin.cliente.lblprecioTotal.getText().isEmpty()){
			costoActual=0;
		}else{
			costoActual=Double.parseDouble(vLogin.cliente.lblprecioTotal.getText().replace(',', '.'));
		}
		
		vLogin.cliente.cBCantidad.setSelectedItem("2");
		vLogin.cliente.tableProductosP.changeSelection(0, 1, false, false);		
		vLogin.cliente.btnAnadir.doClick();	
		costoNuevo=Double.parseDouble(vLogin.cliente.lblprecioTotal.getText().replace(',', '.'));
		costoCorrecto=costoActual+Double.parseDouble(vLogin.cliente.tableProductosP.getModel().getValueAt(vLogin.cliente.tableProductosP.getSelectedRow(), 2).toString())*2;			
		assertTrue(costoNuevo==costoCorrecto);
	}
	public void testEliminarProductosC() throws Exception{
		double costoActual;
		double costoNuevo;
		double costoCorrecto;
		double resto;
		
		vLogin.cliente.cBCantidad.setSelectedItem("4");
		vLogin.cliente.tableProductosP.changeSelection(1, 1, false, false);		
		vLogin.cliente.btnAnadir.doClick();	
		vLogin.cliente.cBCantidad.setSelectedItem("1");
		vLogin.cliente.tablePE.changeSelection(0, 1, false, false);
		if(vLogin.cliente.lblprecioTotal.getText().isEmpty()){
			costoActual=0;
		}else{
			costoActual=Double.parseDouble(vLogin.cliente.lblprecioTotal.getText().replace(',', '.'));
		}
		costoCorrecto=costoActual-Double.parseDouble(vLogin.cliente.tablePE.getModel().getValueAt(vLogin.cliente.tablePE.getSelectedRow(), 1).toString())*1;
		vLogin.cliente.btnEliminar.doClick();			
		costoNuevo=Double.parseDouble(vLogin.cliente.lblprecioTotal.getText().replace(',', '.'));			
		assertTrue(costoNuevo==costoCorrecto);		
	}
	public void testEstablecerPedidoC() throws Exception{
		testAnadirProductosC();
		vLogin.cliente.txtPeriodicidad.setText("5");
		vLogin.cliente.comboBoxFormaPago.setSelectedItem("Pay Pal");
		vLogin.cliente.txtCantidadMin.setText("2");
		vLogin.cliente.btnEstablecerPedido.doClick();		
		assertTrue(equalsTablas(vLogin.cliente.tablePE, vLogin.cliente.tableProductos));
		
	}
	public void testActulizarExistenciasC() throws Exception{
		vLogin.cliente.txtPeriodicidad.setText("5");
		vLogin.cliente.comboBoxFormaPago.setSelectedItem("Pay Pal");
		vLogin.cliente.txtCantidadMin.setText("2");
		vLogin.cliente.btnEstablecerPedido.doClick();
		
		vLogin.cliente.tableProductos.changeSelection(0, 2, false, false);//Ponemos chanceSelection porque al ejecutar btnAnadirP se tiene que tener seleccionado un elemento de la tabla, que va a ser el que se encuentra en la fila 0.	
		String exis1=(String)vLogin.cliente.tableProductos.getModel().getValueAt(vLogin.cliente.tableProductos.getSelectedRow(), 2);
		String aux="5";		
		vLogin.cliente.txtE.setText(aux);
		vLogin.cliente.btnAnadirP.doClick();		
		String exis2=String.valueOf(vLogin.cliente.tableProductos.getValueAt(0, 2));//Aqui se pone 0 porque es el producto al que hemos modificado la cantidad y no seguimos utilizando getSelectedRow() porque al dar al botón la selección se quita.
		assertTrue((Integer.parseInt(exis1)+Integer.valueOf(aux))==Integer.valueOf(exis2));
		
	}
	
	public void testEliminarExistenciasC() throws Exception{
		vLogin.cliente.tableProductos.changeSelection(0, 2, false, false);//Ponemos chanceSelection porque al ejecutar btnLector se tiene que tener seleccionado un elemento de la tabla, que va a ser el que se encuentra en la fila 0.	
		String exis1=(String)vLogin.cliente.tableProductos.getModel().getValueAt(vLogin.cliente.tableProductos.getSelectedRow(), 2);
		String aux="1";		
		vLogin.cliente.txtE.setText(aux);
		vLogin.cliente.btnLector.doClick();		
		String exis2=String.valueOf(vLogin.cliente.tableProductos.getValueAt(0, 2));//Aqui se pone 0 porque es el producto al que hemos modificado la cantidad y no seguimos utilizando getSelectedRow() porque al dar al botón la selección se quita.
		assertTrue((Integer.parseInt(exis1)-Integer.valueOf(aux))==Integer.valueOf(exis2));
		
	}
	public void testCerrarSesionC() throws Exception{
		vLogin.cliente.btnCerrarSesion.doClick();
		assertTrue(vLogin.window.frmLogin.isVisible());
		
	}
	protected void setUp(){
		/*DefaultTableModel modelo = (DefaultTableModel) vLogin.cliente.tablePE.getModel();
        while(modelo.getRowCount()>0)modelo.removeRow(0);
 
        TableColumnModel modCol = vLogin.cliente.tablePE.getColumnModel();
        while(modCol.getColumnCount()>0)modCol.removeColumn(modCol.getColumn(0));*/
        vLogin.cliente.btnAnadir.setEnabled(true);
        vLogin.cliente.btnEliminar.setEnabled(true);
        vLogin.cliente.cBCantidad.setEnabled(true);
        vLogin.cliente.btnEstablecerPedido.setEnabled(true);
        vLogin.cliente.txtPeriodicidad.setEnabled(true);
        vLogin.cliente.txtCantidadMin.setEnabled(true);
        vLogin.cliente.comboBoxFormaPago.setEnabled(true);
	}

	/*public boolean comprobar(VentanaLogin vLogin){
		boolean ok=true;
		for(int i=0;i< vLogin.cliente.tablePE.getModel().getRowCount();i++){
			if(!vLogin.cliente.tablePE.getModel().getValueAt(i, 0).equals(vLogin.cliente.tableProductos.getModel().getValueAt(i, 0))){
				ok=false;
			}
		}
		return ok;
	}*/
	
	public VentanaLogin iniciarSesion(){
		VentanaLogin vLogin=new VentanaLogin();		
		vLogin.txtUsuario.setText("111111");
		vLogin.txtContrasena.setText("12345");		
		vLogin.btnAceptar.doClick();
		return vLogin;
	}
	public boolean equalsTablas(JTable tableInicial, JTable tableFinal){
		boolean encontrado=true;
		for(int i=0; i<tableInicial.getRowCount() && encontrado; i++){
			encontrado=false;
			for(int j=0; j<tableFinal.getRowCount(); j++){
				if(tableInicial.getModel().getValueAt(i, 0).equals(tableInicial.getModel().getValueAt(j, 0))) encontrado=true;
			}
			
		}
		return encontrado;
	}
	public VentanaLogin iniciarSesionP(){
		vLogin=new VentanaLogin();		
		vLogin.txtUsuario.setText("333333");
		vLogin.txtContrasena.setText("12345");		
		vLogin.btnAceptar.doClick();
		return vLogin;
	}
	public void testLoginP() {		
		iniciarSesionP();
		assertTrue(vLogin.pro.isVisible());			
	}
	public void testAnadirProductosP(){		
		String nombre="Jamon Serrano";
		String precio="32.00";
		vLogin.pro.txtNombre.setText(nombre);
		vLogin.pro.txtPrecio.setText(precio);
		vLogin.pro.btnAnadirP.doClick();
		assertTrue((vLogin.pro.tableProductos.getModel().getValueAt(vLogin.pro.tableProductos.getModel().getRowCount()-1, 1).equals(nombre)) && (vLogin.pro.tableProductos.getModel().getValueAt(vLogin.pro.tableProductos.getModel().getRowCount()-1, 2).equals(precio)));			
		
	}
	public void testEliminarProductosP(){
		testAnadirProductosP();
		vLogin.pro.tableProductos.changeSelection(0, 1, false, false);
		String nombre=vLogin.pro.tableProductos.getModel().getValueAt(vLogin.pro.tableProductos.getSelectedRow(), 1).toString();
		vLogin.pro.btnEliminarP.doClick();
		assertTrue(comprobacionEliminacion(nombre, vLogin.pro.tableProductos));
	}
	public void testModificarProductosP(){
		testAnadirProductosP();
		int indice=0;
		vLogin.pro.tableProductos.changeSelection(indice, 1, false, false);
		String nombre="Salchichas";
		String precio="5.30";
		vLogin.pro.txtNombre.setText(nombre);
		vLogin.pro.txtPrecio.setText(precio);
		vLogin.pro.btnModificarP.doClick();
		assertTrue((vLogin.pro.tableProductos.getModel().getValueAt(indice, 1).toString().equals(nombre)) &&(vLogin.pro.tableProductos.getModel().getValueAt(indice, 2).toString().equals(precio)));
		
	}
	public void testAnadirCliente(){
		vLogin.pro.setVisible(true);
		String cif="686768";
		String nombre="Carrefour";
		String pais="España";
		String provincia="Ciudad Real";
		String direccion="c/ Felipe II";
		String codigoPostal="78683";
		vLogin.pro.cBDia.setSelectedItem("4");
		vLogin.pro.cBMes.setSelectedItem("Febrero");
		vLogin.pro.cBAno.setSelectedItem("2015");
		vLogin.pro.txtCif.setText(cif);
		vLogin.pro.txtnombre.setText(nombre);
		vLogin.pro.txtpais.setText(pais);
		vLogin.pro.txtprovincia.setText(provincia);
		vLogin.pro.txtdireccion.setText(direccion);
		vLogin.pro.txtcp.setText(codigoPostal);
		vLogin.pro.btnAnadir.doClick();
		assertTrue(vLogin.pro.tableClientes.getModel().getValueAt(vLogin.pro.tableClientes.getRowCount()-1, 1).equals(nombre));
	}
	
	public void testEliminarCliente(){
		vLogin.pro.tableClientes.changeSelection(0, 1, false, false);
		String nombre=vLogin.pro.tableClientes.getModel().getValueAt(vLogin.pro.tableClientes.getSelectedRow(), 1).toString();
		vLogin.pro.btnEliminar.doClick();
		assertTrue(comprobacionEliminacion(nombre, vLogin.pro.tableClientes));
	}
	
	public void testModificarCliente(){
		testAnadirCliente();
		int indice;
		vLogin.pro.tableClientes.changeSelection(0, 1, false, false);
		String CIF = (String) vLogin.pro.tableClientes.getValueAt(
				vLogin.pro.tableClientes.getSelectedRow(), 0);
		for (int i = 0; i < vLogin.pro.listaC.size(); i++) {
			if (CIF.equals(vLogin.pro.listaC.get(i).getCIF())) {
				vLogin.pro.txtCif.setText(vLogin.pro.listaC.get(i).getCIF());
				vLogin.pro.txtnombre.setText(vLogin.pro.listaC.get(i).getNombre());
				vLogin.pro.txtdireccion.setText(vLogin.pro.listaC.get(i).getDireccion());
				vLogin.pro.txtpais.setText(vLogin.pro.listaC.get(i).getPais());
				vLogin.pro.txtcp.setText(String.valueOf(vLogin.pro.listaC.get(i).getCp()));
				vLogin.pro.txtprovincia.setText(vLogin.pro.listaC.get(i).getProvincia());
			}
		}
			
		String nombre = "Carrefour";
		String ciudad = "Ciudad real";
		vLogin.pro.txtnombre.setText(nombre);
		vLogin.pro.txtprovincia.setText(ciudad);
		indice=vLogin.pro.tableClientes.getSelectedRow();
		vLogin.pro.btnModificar.doClick();
		assertTrue((vLogin.pro.tableClientes.getModel().getValueAt(indice, 1).equals(nombre)) && (vLogin.pro.tableClientes.getModel().getValueAt(indice, 3).toString().equals(ciudad)));
	}
	public void testMostrarExistencias() throws Exception{		
		cargarExistenciasP();		
		vLogin.pro.tableClientes.changeSelection(0, 1, false, false);		
		vLogin.pro.btnV.doClick();		
		assertTrue(comprobar(vLogin)/*&&/*vLogin.pro.vexistencias.isVisible()*/);
		
	}
	public void testCerrarSesionP(){
		vLogin.pro.btnCerrarSesion.doClick();
		assertTrue(vLogin.window.frmLogin.isVisible());
		
	}
	public void cargarExistenciasP() throws Exception{
		LinkedList <Productos> producto=new <Productos> LinkedList();		
		producto.add(new Productos("6","27.01", "Jamon Iberico"));
		producto.add(new Productos("10","15.81", "Paleta Iberico"));
		producto.add(new Productos("12","39.50", "Lomo artesano"));
		String titulos[]={"Nombre","Precio","Existencias"};
		String datos[]=new String [3];
		vLogin.cliente.m = new DefaultTableModel(null,titulos);
		for(int i=0;i<producto.size();i++){
			datos[0]=producto.get(i).getNombre();
			datos[1]=producto.get(i).getPrecio();
			datos[2]=producto.get(i).getExistencias();
			vLogin.cliente.m.addRow(datos);
		}		
		vLogin.pro.vexistencias.tableExistencias.setModel(vLogin.cliente.m);
		vLogin.cliente.tableProductos.setModel(vLogin.cliente.m);
		
	}
	public boolean comprobacionEliminacion(String nombre, JTable table){
		boolean eliminacion=true;
		for(int i=0; i < table.getRowCount(); i++){
			if(table.getModel().getValueAt(i, 1).toString().equals(nombre)){
				eliminacion=false;
			}
		}
		return eliminacion;
	}
	public boolean comprobar(VentanaLogin vLogin){
		boolean ok=true;
		for(int i=0;i< vLogin.cliente.tablePE.getModel().getRowCount() && ok;i++){
			if(!vLogin.cliente.tablePE.getModel().getValueAt(i, 0).equals(vLogin.pro.vexistencias.tableExistencias.getModel().getValueAt(i, 0))){
				ok=false;
			}
		}
		return ok;
	}
	public void testEliminarProductosB(){	
		VentanaLogin vLogin=new VentanaLogin();		
		vLogin.txtUsuario.setText("111111");
		vLogin.txtContrasena.setText("12345");		
		vLogin.btnAceptar.doClick();
		vLogin.cliente.cBCantidad.setSelectedItem("4");
		vLogin.cliente.tableProductosP.changeSelection(1, 1, false, false);	
		String nombre=vLogin.cliente.tableProductosP.getModel().getValueAt(vLogin.cliente.tableProductosP.getSelectedRow(), 1).toString();
		vLogin.cliente.btnAnadir.doClick();	
		vLogin.cliente.cBCantidad.setSelectedItem("5");
		vLogin.cliente.tablePE.changeSelection(vLogin.cliente.tablePE.getRowCount()-1, 1, false, false);
		vLogin.cliente.btnEliminar.doClick();			
		assertTrue(comprobacion(nombre, vLogin.cliente.tablePE));		
	}
	public boolean comprobacion(String nombre, JTable table){
		boolean eliminacion=true;
		String cadena;
		for(int i=0; i < table.getRowCount(); i++){
			if(table.getModel().getValueAt(i, 0).toString().equals(nombre)){
				eliminacion=false;
			}
		}
		return eliminacion;
	}
	

}
